package com.epfuse.cloud.common.redis.serializer;

import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.lang.Nullable;

import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;

/**
 * @ClassName Serializer
 * @Description Tips：模板方法模式：定义一个操作中算法的骨架（或称为顶级逻辑），将一些步骤（或称为基本方法）的执行延迟到其子类中;
 * Tips：基本方法：抽象方法 + 具体方法final + 钩子方法;
 * @Author 孙峰
 * @Date 2022/11/7 10:00
 */
public abstract class AbstractRedisSerializer implements RedisSerializer<Object> {
    protected static final byte[] EMPTY_ARRAY = new byte[0];

    /**
     * 判断数组是否为空
     * @param data
     * @return
     */
    protected static boolean isEmpty(@Nullable byte[] data) {
        return (data == null || data.length == 0);
    }

    /**
     * 判断对象是否为空
     * @param obj
     * @return
     */
    protected static boolean isEmpty(@Nullable Object obj) {
        if (obj == null) {
            return true;
        }
        if (obj instanceof Optional) {
            return !((Optional<?>) obj).isPresent();
        }
        if (obj instanceof CharSequence) {
            return ((CharSequence) obj).length() == 0;
        }
        if (obj.getClass().isArray()) {
            return Array.getLength(obj) == 0;
        }
        if (obj instanceof Collection) {
            return ((Collection<?>) obj).isEmpty();
        }
        if (obj instanceof Map) {
            return ((Map<?, ?>) obj).isEmpty();
        }

        // else
        return false;
    }
}
